﻿using AppForm_Managers.Object_Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppForm_Managers.Views
{
    public partial class Organizations_Form : Form
    {
        public Organizations_Form()
        {
            InitializeComponent();
        }

        private void Organizations_Form_Load(object sender, EventArgs e)
        {
            DropProvinces_DataLoad();
            GridOgrans_Load(sender, e);
            GridsDeparts_Load(sender, e);

            Notifications.Visible = false;
            Notifications.Text = "";
            ErrorProvider.Dispose();
        }

        private void DropProvinces_DataLoad()
        {
            using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
            {
                List<Province> list = new List<Province>();
                Province pv = new Province()
                {
                    ProvID = 0,
                    NameOfProvince = "Lựa Chọn"
                };
                list.Add(pv);
                list.AddRange(db.Provinces.ToList());

                ComboProvinces.DataSource = list;
                ComboProvinces.DisplayMember = "NameOfProvince";
                ComboProvinces.ValueMember = "ProvID";
                ComboProvinces.SelectedIndex = 0;
            }
        }

        private void ComboProvinces_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<District> list = new List<District>();
                District dis = new District()
                {
                    DistID = 0,
                    NameOfDist = "Lựa Chọn"
                };
                list.Add(dis);

                if (ComboProvinces.SelectedIndex == 0)
                {
                    ComboDistricts.DataSource = list;
                    ComboDistricts.DisplayMember = "NameOfDist";
                    ComboDistricts.ValueMember = "DistID";
                    ComboDistricts.SelectedIndex = 0;
                }
                else
                {
                    int id = Int32.Parse(ComboProvinces.SelectedValue.ToString());
                    Province prv = db.Provinces.Single(p => p.ProvID == id);
                    list.AddRange(prv.Districts.ToList());

                    ComboDistricts.DataSource = list;
                    ComboDistricts.DisplayMember = "NameOfDist";
                    ComboDistricts.ValueMember = "DistID";
                    ComboDistricts.SelectedIndex = 0;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau.", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ComboDistricts_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
                {
                    List<Commune> list = new List<Commune>();
                    Commune temp = new Commune()
                    {
                        ComID = 0,
                        NameOfComm = "Lựa Chọn"
                    };
                    list.Add(temp);

                    if (ComboDistricts.SelectedIndex == 0)
                    {
                        ComboCommunes.DataSource = list;
                        ComboCommunes.DisplayMember = "NameOfComm";
                        ComboCommunes.ValueMember = "ComID";
                        ComboCommunes.SelectedIndex = 0;
                    }
                    else
                    {
                        int id = Int32.Parse(ComboDistricts.SelectedValue.ToString());
                        District prv = db.Districts.Single(p => p.DistID == id);
                        list.AddRange(prv.Communes.ToList());

                        ComboCommunes.DataSource = list;
                        ComboCommunes.DisplayMember = "NameOfComm";
                        ComboCommunes.ValueMember = "ComID";
                        ComboCommunes.SelectedIndex = 0;
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau.", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }

        private void GridOgrans_Load(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                GridOgrans.DataSource = db.View_Ogranizations.ToList();
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy quay lại sau", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void GridsDeparts_Load(object sender, EventArgs e)
        {
            using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
            {
                GridsDeparts.DataSource = db.View_Departments.ToList();
            }
        }

        private void ViewOgrans_Click(object sender, EventArgs e)
        {
            Notifications.Visible = false;
            Notifications.Text = "";
            ErrorProvider.Dispose();

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<int> listSelected = ViewOgrans.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }
                if (index > -1)
                {
                    UpdateButton.Enabled = true;
                    DeleteButton.Enabled = true;
                    AddButton.Enabled = false;


                    int ogranID = Int32.Parse(ViewOgrans.GetRowCellValue(index, "OrgID").ToString());
                    CodeText.Text = ViewOgrans.GetRowCellValue(index, "CodeOfOgran").ToString();
                    NameText.Text = ViewOgrans.GetRowCellValue(index, "NameOfOrgan").ToString();
                    DescText.Text = ViewOgrans.GetRowCellValue(index, "Descriptons").ToString();
                    CheckStatus.Checked = bool.Parse(ViewOgrans.GetRowCellValue(index, "OrgStatus").ToString());

                    int ComID = Int32.Parse(ViewOgrans.GetRowCellValue(index, "ComID").ToString());
                    Commune comm = db.Communes.Single(d => d.ComID == ComID);

                    ComboProvinces.SelectedValue = comm.District.ProvID;
                    ComboDistricts.SelectedValue = comm.DistID;
                    ComboCommunes.SelectedValue = comm.ComID;

                    // Invoke Grid Departs
                    GridsDeparts.DataSource = db.Proc_ViewDepartmentsByOgranID(ogranID).ToList();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy quay lại sau", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void Controls_Reset()
        {
            AddButton.Enabled = true;
            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;

            ComboProvinces.SelectedIndex = 0;
            CodeText.Text = "";
            NameText.Text = "";
            DescText.Text = "";
            CheckStatus.Checked = false;
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            Notifications.Visible = true;
            Notifications.Text = "";
            ErrorProvider.Dispose();


            if (ComboProvinces.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboProvinces, "Bạn chưa chọn tỉnh thành");
                ComboProvinces.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (ComboDistricts.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboDistricts, "Bạn chưa chọn quận, huyện");
                ComboDistricts.Focus();
                return;
            }


            if (ComboCommunes.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboCommunes, "Bạn chưa chọn xã, phường.");
                return;
            }
            else
                ErrorProvider.Dispose();

            if (CodeText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(CodeText, "Mã tổ chức không được để trống");
                CodeText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (NameText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(NameText, "Tên tổ chức không được để trống");
                NameText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (DescText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(DescText, "Mô tả không được để trống");
                DescText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                Organization org = new Organization()
                {
                    CodeOfOgran = CodeText.Text.Trim(),
                    NameOfOrgan = NameText.Text.Trim(),
                    Descriptons = DescText.Text.Trim(),
                    OrgStatus = CheckStatus.Checked,
                    ComID = int.Parse(ComboCommunes.SelectedValue.ToString())
                };

                int comuuneID = Int32.Parse(ComboCommunes.SelectedValue.ToString());
                Commune comm = db.Communes.Single(c => c.ComID == comuuneID);
                foreach (var item in comm.Organizations)
                {
                    if (item.NameOfOrgan.ToLower().Equals(NameText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(NameText, "Trong xã, phường đã có tên cơ quan này");
                        Notifications.Visible = true;
                        Notifications.Text = "Trong xã, phường đã có tên cơ quan này";
                        Notifications.ForeColor = Color.OrangeRed;
                        NameText.Focus();
                        return;
                    }
                }

                foreach (var item in db.Organizations)
                {
                    if (item.CodeOfOgran.ToLower().Equals(CodeText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(CodeText, "Mã tổ chức,cơ quan này đã được sử dụng");
                        Notifications.Visible = true;
                        Notifications.Text = "Mã tổ chức,cơ quan này đã được sử dụng";
                        Notifications.ForeColor = Color.OrangeRed;
                        CodeText.Focus();
                        return;
                    }
                }
                db.Organizations.Add(org);

                db.SaveChanges();

                ErrorProvider.Dispose();
                Controls_Reset();
                GridOgrans_Load(sender, e);
                Notifications.Text = "Thêm cơ quan, tổ chức thành công.";
                Notifications.Visible = true;
                Notifications.ForeColor = Color.Teal;
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            Notifications.Visible = true;
            Notifications.Text = "";
            ErrorProvider.Dispose();

            if (ComboProvinces.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboProvinces, "Bạn chưa chọn tỉnh thành");
                ComboProvinces.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (ComboDistricts.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboDistricts, "Bạn chưa chọn quận, huyện");
                ComboDistricts.Focus();
                return;
            }


            if (ComboCommunes.SelectedIndex == 0)
            {
                ErrorProvider.SetError(ComboCommunes, "Bạn chưa chọn xã, phường.");
                return;
            }
            else
                ErrorProvider.Dispose();

            if (CodeText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(CodeText, "Mã tổ chức không được để trống");
                CodeText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (NameText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(NameText, "Tên tổ chức không được để trống");
                NameText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            if (DescText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(DescText, "Mô tả không được để trống");
                DescText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            List<int> listSelected = ViewOgrans.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            int orgId = 0;
            if (index > -1)
            {
                orgId = Int32.Parse(ViewOgrans.GetRowCellValue(index, "OrgID").ToString());
            }

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {

                int comuuneID = Int32.Parse(ComboCommunes.SelectedValue.ToString());
                Commune comm = db.Communes.Single(c => c.ComID == comuuneID);
                foreach (var item in comm.Organizations)
                {
                    if (item.NameOfOrgan.ToLower().Equals(NameText.Text.Trim().ToLower()) && item.OrgID != orgId)
                    {
                        ErrorProvider.SetError(NameText, "Trong xã, phường đã có tên cơ quan này");
                        Notifications.Visible = true;
                        Notifications.Text = "Trong xã, phường đã có tên cơ quan này";
                        Notifications.ForeColor = Color.OrangeRed;
                        NameText.Focus();
                        return;
                    }
                }
                foreach (var item in db.Organizations)
                {
                    if (item.CodeOfOgran.ToLower().Equals(CodeText.Text.Trim().ToLower())
                        && item.OrgID != orgId)
                    {
                        ErrorProvider.SetError(CodeText, "Mã tổ chức,cơ quan này đã được sử dụng");
                        Notifications.Visible = true;
                        Notifications.Text = "Mã tổ chức,cơ quan này đã được sử dụng";
                        Notifications.ForeColor = Color.OrangeRed;
                        CodeText.Focus();
                        return;
                    }
                }
                Organization org = db.Organizations.Single(o => o.OrgID == orgId);

                org.CodeOfOgran = CodeText.Text;
                org.NameOfOrgan = NameText.Text;
                org.Descriptons = DescText.Text;
                org.OrgStatus = CheckStatus.Checked;
                org.ComID = int.Parse(ComboCommunes.SelectedValue.ToString());
                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();
                    ErrorProvider.Dispose();

                    GridOgrans_Load(sender, e);
                    Controls_Reset();

                    Notifications.Visible = true;
                    Notifications.Text = "Thay đổi thông tin tổ chức,cơ quan thành công";
                    Notifications.ForeColor = Color.Teal;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void DeleteButton_Click(object sender, EventArgs e)
        {
            List<int> listSelected = ViewOgrans.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            int orgId = 0;
            if (index > -1)
            {
                orgId = Int32.Parse(ViewOgrans.GetRowCellValue(index, "OrgID").ToString());
            }


            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {

                Organization org = db.Organizations.Single(o => o.OrgID == orgId);
                db.Organizations.Remove(org);

                if (MessageBox.Show("Bạn có muốn xóa cơ quan, tổ chức này", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    ErrorProvider.Dispose();

                    GridOgrans_Load(sender, e);
                    Controls_Reset();

                    Notifications.Visible = true;
                    Notifications.Text = "Xóa tổ chức,cơ quan thành công";
                    Notifications.ForeColor = Color.Teal;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn hủy bỏ thao tác và làm mới", "Hủy bỏ thao tác", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                Notifications.Visible = false;
                Notifications.Text = "";
                Controls_Reset();
                ErrorProvider.Dispose();

                GridOgrans_Load(sender, e);
                GridsDeparts_Load(sender, e);
            }
        }
    }
}